#include "herramienta3d.h"
#include "visor3d.h"
#include "angulo.h"

void HerramientaPrueba::activar()
{
    procesando = false;
}

void HerramientaPrueba::procesarEventoPress(QMouseEvent* evento, Visor3d* visor3d)
{
    procesando = true; 
    posicionInicial = evento->pos();
}

void HerramientaPrueba::procesarEventoMove(QMouseEvent* evento, Visor3d* visor3d)
{
    if (!procesando) {
        return;
    }      

    QPoint posicionActual = evento->pos();
    int incrementoX = posicionActual.x() - posicionInicial.x();
    int incrementoY = posicionActual.y() - posicionInicial.y();
    posicionInicial = posicionActual;

    Camara* camara = visor3d->getCamara();

    if (evento->buttons() & Qt::LeftButton) {
        double desplazamientoX = incrementoX / 100.0;
        double desplazamientoY = incrementoY / 100.0;
        Vector3d vectorDesplazamientoHorizontal = camara->getVectorDireccion();
        vectorDesplazamientoHorizontal.girar(90, 0);
        vectorDesplazamientoHorizontal.setModulo(desplazamientoX);
        camara->desplazar(vectorDesplazamientoHorizontal);

        Vector3d vectorDesplazamientoVertical = camara->getVectorDireccion();
        vectorDesplazamientoVertical.girar(0, -90);
        vectorDesplazamientoVertical.setModulo(desplazamientoY);
        camara->desplazar(vectorDesplazamientoVertical);

    } else if (evento->buttons() & Qt::RightButton) {
        double gradosAzimud = incrementoX / 10.0;
        double gradosColatitud = -incrementoY / 10.0;
        camara->girar(gradosAzimud, gradosColatitud);

    } else if (evento->buttons() & Qt::MiddleButton) {
        double gradosAzimud = incrementoX / 10.0;
        double gradosColatitud = -incrementoY / 10.0;
        camara->rotarSobrePuntoVista(gradosAzimud, gradosColatitud);
    }
    visor3d->actualizar();
}

void HerramientaPrueba::procesarEventoRelease(QMouseEvent* evento, Visor3d* visor3d)
{
    procesando = false;
}

void HerramientaPrueba::procesarEventoWheel(QWheelEvent* evento, Visor3d* visor3d)
{
    int grados = evento->delta() / 8;
    int pasos = grados / 15;

    Camara* camara = visor3d->getCamara();
    camara->acercar(pasos / 10.0);
    visor3d->actualizar();
}


////////////////////////////////////////////////////////////////////////////////////////////////////

void HerramientaPrueba2d::activar()
{
    procesando = false;
}

void HerramientaPrueba2d::procesarEventoPress(QMouseEvent* evento, Visor3d* visor3d)
{
    procesando = true; 
    posicionInicial = evento->pos();
}

void HerramientaPrueba2d::procesarEventoMove(QMouseEvent* evento, Visor3d* visor3d)
{
    if (!procesando) {
        return;
    }      

    QPoint posicionActual = evento->pos();
    int incrementoX = posicionActual.x() - posicionInicial.x();
    int incrementoY = posicionActual.y() - posicionInicial.y();
    posicionInicial = posicionActual;

    Camara* camara = visor3d->getCamara();

    if (evento->buttons() & Qt::LeftButton) {
        double desplazamientoX = -incrementoX / 100.0;
        double desplazamientoY = incrementoY / 100.0;
        Vector3d vectorDesplazamiento(desplazamientoX, desplazamientoY, 0);
        camara->desplazar(vectorDesplazamiento);
    } 
    visor3d->actualizar();
}

void HerramientaPrueba2d::procesarEventoRelease(QMouseEvent* evento, Visor3d* visor3d)
{
    procesando = false;
}

void HerramientaPrueba2d::procesarEventoWheel(QWheelEvent* evento, Visor3d* visor3d)
{
    int grados = evento->delta() / 8;
    int pasos = grados / 15;

    Camara* camara = visor3d->getCamara();
    camara->acercar(pasos / 10.0);
    visor3d->actualizar();
}